package untils

import (
	"encoding/json"
	mqtt "github.com/eclipse/paho.mqtt.golang"
	"go.uber.org/zap"
	"hospital-srv/pkg"
	"log"
	"time"
)

// TemperatureData 温度计
type TemperatureData struct {
	UserId                      int64   `json:"user_id"`                        // 用户ID
	TempValue                   float32 `json:"temp_value"`                     // 温度值
	BloodSugarValue             float32 `json:"blood_sugar_value"`              // 血糖值
	SystolicBloodPressureValue  float32 `json:"systolic_blood_pressure_value"`  // 血压收缩压值
	DiastolicBloodPressureValue float32 `json:"diastolic_blood_pressure_value"` // 血压舒张压值
	BloodOxygenValue            float32 `json:"blood_oxygen_value"`             // 血氧值
	DeviceID                    int64   `json:"device_id"`                      //设备Id
}

// 消息处理函数
var MessagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
	// 处理接收到的消息
	log.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
	var payload TemperatureData
	if err := json.Unmarshal(msg.Payload(), &payload); err != nil {
		pkg.Error("MQTT消息解析失败", zap.Error(err))
		return
	}
}

func StartPublisher(topic string, UserId, DeviceID int64, TempValue, BloodSugarValue, SystolicBloodPressureValue, DiastolicBloodPressureValue, BloodOxygenValue float32) mqtt.Client {
	// 创建客户端选项
	// 使用全局已连接的 EmQx 客户端进行订阅
	TimeNow := time.Now().Format("2024-11-26 11:50:30")
	opts := mqtt.NewClientOptions()
	// 配置 EMQX 服务器地址和端口
	opts.AddBroker("tcp://broker.emqx.io:1883")
	// 配置客户端ID
	opts.SetClientID(topic)
	// 设置默认消息处理函数
	opts.SetDefaultPublishHandler(MessagePubHandler)
	// 连接到 EMQX 服务器
	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		pkg.Fatal("连接EMQX失败"+TimeNow, zap.Error(token.Error()))
	} else {
		pkg.Info("Connected to MQTT broker")
	}
	// 订阅主题 等待订阅完成
	token := client.Subscribe(topic, 1, MessagePubHandler)
	if token.Wait() && token.Error() != nil {
		pkg.Fatal("订阅失败", zap.Error(token.Error()))
	} else {
		pkg.Info("Subscribed to " + topic)
	}
	// 发布消息
	data := TemperatureData{
		UserId:                      UserId,
		TempValue:                   BloodOxygenValue,
		BloodSugarValue:             TempValue,
		SystolicBloodPressureValue:  BloodSugarValue,
		DiastolicBloodPressureValue: SystolicBloodPressureValue,
		BloodOxygenValue:            DiastolicBloodPressureValue,
		DeviceID:                    DeviceID,
	}
	jsonData, _ := json.Marshal(data)
	token = client.Publish(topic, 1, true, jsonData)
	token.Wait()
	return client
}
